
package com.hd2tecnologia.modeloBanco;

import com.hd2tecnologia.auth.Auth;
import com.hd2tecnologia.banco.AcessoBanco;
import com.hd2tecnologia.entidades.Produto;
import com.hd2tecnologia.entidades.Usuario;
import com.hd2tecnologia.mensagens.LogErros;
import com.hd2tecnologia.utilidades.Icones;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Dulcyelliton Silva
 */
public class UsuarioBD {

    private static UsuarioBD instance;
    private PreparedStatement ps;
    private Connection con;
    private ResultSet rs;
    private AcessoBanco dados = new AcessoBanco();
    private String consultaUsuario = "SELECT * FROM usuario";
    private String consultaUsuarioNome = "SELECT * FROM usuario WHERE usuario.nome LIKE ?";
    private String incluiUsuario = "INSERT INTO usuario (nome, email, telefone, login, senha, tipo) values(?, ?, ?, ?, ?, ?)";
    private String alteraUsuario = "UPDATE usuario SET nome = ?, email = ?, telefone = ?, login = ?, senha = ?, tipo = ? WHERE usuario.id = ?";
    private String excluiUsuario = "DELETE FROM usuario WHERE usuario.id = ?";
    private String autenticarUsuario = "SELECT id, login, senha, tipo, nome FROM usuario WHERE login = ?";
    Icones icone = new Icones();
    
    public List<Usuario> consultaUsuario() {
        List<Usuario> listaUsuarios = new ArrayList<Usuario>();
        Usuario usuario;
        try {
            con = dados.conectar();
            ps = con.prepareStatement(consultaUsuario);
            rs = ps.executeQuery();
            while (rs.next()) {
                usuario = new Usuario();
                usuario.setId(rs.getInt("id"));
                usuario.setNome(rs.getString("nome"));
                usuario.setTelefone(rs.getString("telefone"));
                usuario.setEmail(rs.getString("email"));
                usuario.setTipo(rs.getInt("tipo"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));

                listaUsuarios.add(usuario);
            }
            dados.desconectar();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return listaUsuarios;
    }

    public List<Usuario> consultaUsuario(String nome) {
        List<Usuario> listaUsuarios = new ArrayList<Usuario>();
        Usuario usuario;
        try {
            con = dados.conectar();
            ps = con.prepareStatement(consultaUsuarioNome);
            nome = "%" + nome + "%";
            ps.setString(1, nome);
            rs = ps.executeQuery();
            while (rs.next()) {
                usuario = new Usuario();
                usuario = new Usuario();
                usuario.setId(rs.getInt("id"));
                usuario.setNome(rs.getString("nome"));
                usuario.setTelefone(rs.getString("telefone"));
                usuario.setEmail(rs.getString("email"));
                usuario.setTipo(rs.getInt("tipo"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));

                listaUsuarios.add(usuario);
            }
            dados.desconectar();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return listaUsuarios;
    }

    public boolean incluiUsuario(Usuario usuario) {
        try {
            con = dados.conectar();
            ps = con.prepareStatement(incluiUsuario);

            ps.setString(1, usuario.getNome());
            ps.setString(2, usuario.getEmail());
            ps.setString(3, usuario.getTelefone());
            ps.setString(4, usuario.getLogin());
            ps.setString(5, usuario.getSenha());
            ps.setInt(6, usuario.getTipo());
            
            ps.executeUpdate();

            dados.desconectar();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /*
    public boolean alteraUsuario(Usuario usuario) {
        try {
            con = dados.conectar();
            ps = con.prepareStatement(alteraUsuario);
            
            ps.setString(1, usuario.getNome());
            ps.setString(2, usuario.getEmail());
            ps.setString(3, usuario.getTelefone());
            ps.setString(4, usuario.getLogin());
            ps.setString(5, usuario.getSenha());
            ps.setInt(6, usuario.getTipo());
            ps.setInt(7, usuario.getId());
            
            ps.executeUpdate();

            dados.desconectar();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }*/
    
    public boolean alterarUsuario(Usuario usuario) {
        try {
            con = dados.conectar();
            ps = con.prepareStatement(alteraUsuario);

            ps.setString(1, usuario.getNome());
            ps.setString(2, usuario.getEmail());
            ps.setString(3, usuario.getTelefone());
            ps.setString(4, usuario.getLogin());
            ps.setString(5, usuario.getSenha());
            ps.setInt(6, usuario.getTipo());
            ps.setInt(7, usuario.getId());
            
            /*
            ps.setString(1, produto.getNome());
            ps.setInt(2, produto.getFornecedor().getId());
            ps.setInt(3, produto.getQtdeEstoque());
            ps.setDouble(4, produto.getValor());
            ps.setInt(5, produto.getId());
            */
            ps.executeUpdate();

            dados.desconectar();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    public boolean excluiUsuario(Usuario usuario) {
        try {
            con = dados.conectar();
            ps = con.prepareStatement(excluiUsuario);

            ps.setInt(1, usuario.getId());

            ps.executeUpdate();

            dados.desconectar();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }
    
    //=====================================================================================
    //====================== UTILIZADO NA AUTENTICAÇÃO DO USUARIO =========================
    
    public boolean authUsuario(String login, String senha, int tipo) throws SQLException {

        LogErros log = LogErros.getInstance();
        boolean Login = false;
        boolean Senha = false;
        boolean Tipo = false;
        boolean Sucess = false;

        String usuario = login.trim();


        if (usuario.isEmpty() && senha.isEmpty()) {
            log.setMsg("Preencha os campos de Login e Senha corretamente!");
            log.setIcone(icone.getALERTA());
            return false;
        } else {
            if (usuario.trim().isEmpty()) {
                log.setMsg("Preencha o Campo de login corretamente!");
                log.setIcone(icone.getALERTA());
                return false;
            } else {
                if (senha.isEmpty()) {
                    log.setMsg("Preencha o Campo de senha corretamente!");
                    log.setIcone(icone.getALERTA());
                    return false;
                } else {

                    if (tipo == 0) {
                        log.setMsg("Selecione o tipo de usuário!");
                        log.setIcone(icone.getALERTA());
                        return false;
                    } else {

                        dados.conectar();
                        PreparedStatement Stmt;
                        ResultSet rs;

                        Stmt = (PreparedStatement) dados.conectar().prepareStatement(autenticarUsuario);
                        Stmt.setString(1, usuario);

                        rs = Stmt.executeQuery();

                        while (rs.next()) {

                            if ((usuario.equalsIgnoreCase(rs.getString("login")))) {
                                Login = true;

                                if (senha.equalsIgnoreCase(rs.getString("senha"))) {
                                    Senha = true;

                                    if (tipo == rs.getInt("tipo")) {
                                        Tipo = true;
                                        Auth auth = Auth.getInstance();

                                        //LogModelo.getLog(rs.getInt("id"));
                                        //LogModelo.makeLog(rs.getInt("id"));

                                        auth.autenticar(usuario, tipo, rs.getString("nome"));
                                        
                                        
                                        dados.desconectar();
                                        Sucess = true;
                                        return true;
                                    }
                                }
                            }
                        }

                        if (!Login) {

                            log.setMsg("O login informado não existe!");
                            log.setIcone(icone.getALERTA());

                            Stmt.close();
                            rs.close();
                            dados.desconectar();

                            return false;

                        } else {
                            if (!Senha) {
                                log.setMsg("O senha informada está incorreta");
                                log.setIcone(icone.getALERTA());

                                Stmt.close();
                                rs.close();
                                dados.desconectar();

                                return false;
                            } else {
                                if (!Tipo) {
                                    log.setMsg("Desculpe. O Tipo do usuário está incorreto!");
                                    log.setIcone(icone.getALERTA());

                                    Stmt.close();
                                    rs.close();
                                    dados.desconectar();

                                    return false;
                                }
                            }
                        }

                    }
                }
            }
            return Sucess;
        }

    }
   
    public static UsuarioBD getInstance(){
        if(instance==null){
            instance = new UsuarioBD();
        }
        return instance;
    }
        
    public static void kilInstance(){
        instance = null;
    }
    
    
    
}
